/*
    GetPaneHeights: get heights in pixel of all panes in a window

    FOR WHAT:

        With the use of the built-in functions "WindowPriceMin/Max()"
        together, you can calculate appropriate spacing/margin to
        text/arrow objects (OBJ_TEXT/OBJ_ARROW), whatever size the
        window is.  See the EXAMPLE section below.

    SYNOPSIS:

        #import "GetPaneHeights.ex4"
            int GetPaneHeights(int &height[]);
        #import

        height[i] = the height in pixel of pane "i"
            i = 0: main chart
            i = 1: indicator #1
            i = 2: indicator #2
            ... (in top-to-bottom order)

        The size of "height[]" must be large enough to contain all panes.
        This function returns the number of panes.
        If it fails, the return value is zero.

    NOTE:

        This function scans the device context (DC) of a window,
        so if (the leftmost piece of) the window is covered by another
        window, then this function will fail.

    EXAMPLE:

        #import "GetPaneHeights.ex4"
            int GetPaneHeights(int &height[]);
        #import

        int         i, panes, height[10];
        double      spacing;
        string      sign;

        panes = GetPaneHeights(height);
        for (i = 0; i < panes; i++)
            Print("height[", i, "] = ", height[i], " pixels");

        // Analyzing the chart... Hmm... it's time to sell.

        if (panes == 0) {
            Alert("WARNING: cannot get the pane height!");
            height[0] = 500;
        }
        sign = "sell sign";
        spacing = 5 * (WindowPriceMax(0) - WindowPriceMin(0)) / height[0];
        ObjectCreate(sign, OBJ_ARROW, 0, Time[0], High[0] + spacing);
        ObjectSet(sign, OBJPROP_ARROWCODE, ...);
        ObjectSet(sign, OBJPROP_COLOR, ...);

        // The sell sign will be located 5 pixels above the highest price
        // of the latest bar, whatever size the window is.

    Version 1.01, Copyright (c) 2009, kartz

    (Change Log)
        1.00 -> 1.01: fix a bug of recognizing the date-and-time row as a pane
                      on a machine which doesn't use font anti-aliasing.
*/

#property copyright     "Copyright (c) 2009, kartz"
#property library

#import "user32.dll"
    int     GetDC(int hwnd);                            // HDC
    int     ReleaseDC(int hwnd, int hdc);
    int     GetClientRect(int hwnd, int &rect[4]);      // BOOL
#import "gdi32.dll"
    int     GetPixel(int hdc, int x, int y);            // COLORREF
#import

#define CLR_INVALID     0xFFFFFFFF      // Windows' constant
#define TEST_XY_COORD   10

int GetPaneHeights(int &height[])
{

    int     i, x, y, h, c, cc, frame, hwnd, hdc, rect[4];

    hwnd = WindowHandle(Symbol(), Period());
    if (hwnd == 0)
        return(0);
    if (!GetClientRect(hwnd, rect))
        return(0);
    h = rect[3];
    hdc = GetDC(hwnd);
    if (hdc == 0)
        return(0);

    i = 0;
    c = GetPixel(hdc, 0, TEST_XY_COORD);
    if (c != CLR_INVALID) {
        // scan horizontally.
        for (x = 1; x <= TEST_XY_COORD; x++) {
            frame = GetPixel(hdc, x, TEST_XY_COORD);
            if ((frame == CLR_INVALID) || (frame != c))
                break;
        }
        // "x" must be 2, but scanned just in case.
        if (frame != CLR_INVALID) {
            // scan vertically along the frame.
            for (cc = CLR_INVALID, y = 0; y < h; y++, cc = c) {
                c = GetPixel(hdc, x, y);
                if (c == CLR_INVALID) {
                    i = 0;
                    break;
                }
                if (c == frame) {
                    if (cc != frame)
                        height[i] = y;
                } else if (cc == frame) {
                    height[i] = y - height[i] - 1;
                    i++;
                    if (i == WindowsTotal())
                        break;
                }
            }
        }
    }
    ReleaseDC(hwnd, hdc);
    return(i);
}





